package com.pfzy.ui.activity.nested;

import androidx.annotation.Nullable;
import androidx.core.view.ViewCompat;

public interface NestedScrollingChild {
    /**
     * Enable or disable nested scrolling for this view.
     *
     * 启动或者禁用嵌套滑动，如果返回ture，那么说明当前布局存在嵌套滑动的场景，反之没有
     * 使用场景：NestedScrollingParent嵌套NestedScrollingChild
     * 在此接口中的方法，都是交给NestedScrollingChildHelper代理类实现
     */
    void setNestedScrollingEnabled(boolean enabled);

    /**
     * Returns true if nested scrolling is enabled for this view.
     * 其实就是返回setNestedScrollingEnabled中设置的值
     */
    boolean isNestedScrollingEnabled();

    /**
     * Begin a nestable scroll operation along the given axes.
     * 表示view开始滚动了,一般是在ACTION_DOWN中调用，如果返回true则表示父布局支持嵌套滚动。
     * 一般也是直接代理给NestedScrollingChildHelper的同名方法即可。这个时候正常情况会触发Parent的onStartNestedScroll()方法
     */
    boolean startNestedScroll(@ViewCompat.ScrollAxis int axes);

    /**
     * Stop a nested scroll in progress.
     * 停止嵌套滚动，一般在UP或者CANCEL事件中执行，告诉父容器已经停止了嵌套滑动
     */
    void stopNestedScroll();

    /**
     * Returns true if this view has a nested scrolling parent.
     * 判断当前View是否存在嵌套滑动的Parent
     */
    boolean hasNestedScrollingParent();

    /**
     * 当前View消费滑动事件之后，滚动一段距离之后，把剩余的距离回调给父容器，父容器知道当前剩余距离
     * dxConsumed：x轴滚动的距离
     * dyConsumed：y轴滚动的距离
     * dxUnconsumed：x轴未消费的距离
     * dyUnconsumed：y轴未消费的距离
     * 这个方法是嵌套滑动的时候调用才有用，返回值 true分发成功；false 分发失败
     */
    boolean dispatchNestedScroll(int dxConsumed, int dyConsumed,
                                 int dxUnconsumed, int dyUnconsumed, @Nullable int[] offsetInWindow);

    /**
     * Dispatch one step of a nested scroll in progress before this view consumes any portion of it.
     * 在子View消费滑动距离之前，将滑动距离传递给父容器，相当于把消费权交给parent
     * dx：当前水平方向滑动的距离
     * dy：当前垂直方向滑动的距离
     * consumed：输出参数，会将Parent消费掉的距离封装进该参数consumed[0]代表水平方向，consumed[1]代表垂直方向
     * @return true：代表Parent消费了滚动距离
     */
    boolean dispatchNestedPreScroll(int dx, int dy, @Nullable int[] consumed,
                                    @Nullable int[] offsetInWindow);

    /**
     * Dispatch one step of a nested scroll in progress.
     * 处理惯性事件，与dispatchNestedScroll类似，也是在消费事件之后，将消费和未消费的距离都传递给父容器
     */
    boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed);

    /**
     * Dispatch a fling to a nested scrolling parent before it is processed by this view.
     * 与dispatchNestedPreScroll类似，在消费之前首先会传递给父容器，把优先处理权交给父容器
     */
    boolean dispatchNestedPreFling(float velocityX, float velocityY);
}
